package snippets.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;

/**
 * 
 *类描述：FileHandleOfStandardAPI
 *@作者: hjl
 *@日期：2012-9-5 时间：下午01:04:55
 *@功能:以JDK API展示文件处理常用方法
 */
public class FileUtil{
	/**
	 * 方法描述:getFile
	 * @作者:hjl
	 * @日期:2012-10-8 时间:下午04:32:00
	 * @功能: 得到项目的文件
	 * @param topPath
	 * @param filePath
	 * @return
	 */
	public File getFile(String topPath,String filePath){
		File file = null;
		try {
			URL url = new URL(new File("").toURI().toString()+topPath+"/"+filePath);//获得项目目录
			file = new File(url.toURI());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		 catch (URISyntaxException e) {
			 e.printStackTrace();
	    }
		return file;		
	}
	/**
	 *方法描述：getSrcFile
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午01:51:24
	 *@功能:得到src目录下的文件
	 *@参数:eg:filePath="floder/file.suffix"
	 */	
	public File getSrcFile(String filePath){
		return getFile("src",filePath);
	}
	/**
	 *方法描述：getWebRootFil
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午01:53:35
	 *@功能:得到webRoot目录下的文件
	 *@参数:eg:filePath="floder/file.suffix"
	 */
	public File getWebRootFile(String filePath){
		return getFile("WebRoot",filePath);
	}
	/**
	 * 方法描述:getResourceFile
	 * @作者:hjl
	 * @日期:2012-10-8 时间:下午04:38:36
	 * @功能:得到resource目录下的文件 
	 * @param filePath
	 * @return
	 */
	public File getResourceFile(String filePath){
		return getFile("resource",filePath);
	}
	/**
	 *方法描述：getClassFile
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午01:54:42
	 *@功能:得到class目录下的文件
	 *@参数:eg:filePath="floder/file.suffix"
	 *@说明:
	 *1.取消写法:URI uri = this.getClass().getClassLoader().getResource(filePath).toURI();
	 *			 file = new File(uri);
	 *因为得不到不存在的文件
	 */
	public File getClassFile(String filePath){
		int lastIndex = filePath.lastIndexOf("/");
		String folderPath = filePath.substring(0,lastIndex);
		String fileName = filePath.substring(lastIndex+1,filePath.length());
		URL folderUrl = this.getClass().getClassLoader().getResource(folderPath);
		String path = folderUrl.getPath()+"/"+fileName;
		File file = new File(path);
		return file;
	}
	
	/**
	 *方法描述：appendContentToFile
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午01:57:11
	 *@功能:给文件后面添加内容
	 */
	public void appendContentToFile(File file,String strContent){
		try {
			RandomAccessFile randomFile = new RandomAccessFile(file, "rw");
			long fileLength = randomFile.length();
			randomFile.seek(fileLength);
			randomFile.writeBytes(strContent+"/n");
			randomFile.close();
		} catch (FileNotFoundException e) {e.printStackTrace();} 
		  catch (IOException e) {e.printStackTrace();}		
	}
	
	/**
	 *方法描述：clearFileContent
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午01:58:01
	 *@功能:清空文件内容
	 */
	public void clearFileContent(File file){
		try {
			RandomAccessFile randomFile = new RandomAccessFile(file, "rw");
			randomFile.setLength(0);//设置文件长度为0,即为清空
			randomFile.close();
		} catch (FileNotFoundException e) {e.printStackTrace();} 
		  catch (IOException e) {e.printStackTrace();}		
	}
	
	/**
	 *方法描述：createEmptyFile
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午01:59:25
	 *@功能:创建新的空文件
	 */
	public void createEmptyFile(File file){
		try {
			if(!file.getParentFile().exists()){//判断文件路径是否存在,如果不存在,新建路径
				file.getParentFile().mkdirs();
			}	
			file.createNewFile();
			//RandomAccessFile randomFile = new RandomAccessFile(file, "rw");
			//randomFile.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();} 
		  catch (IOException e) {e.printStackTrace();} 
	}
	
	/**
	 *方法描述：deleteFile
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午02:00:43
	 *@功能:删除文件
	 */
	public boolean deleteFile(File file){
		return file.delete();
	}
	
	/**
	 *方法描述：copyAFile
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午02:02:44
	 *@功能:复制一个文件
	 */
	public void copyAFile(File sourceFile,File targetFile){
		InputStream is = null;
		FileOutputStream fos = null;
		if(!targetFile.getParentFile().exists()){
			targetFile.getParentFile().mkdir();
		}
		try {
			targetFile.createNewFile();
			is = new FileInputStream(sourceFile);
			fos = new FileOutputStream(targetFile);
			byte[] buffer = new byte[1024];
			int length = is.read(buffer);
			while(length != -1){
				fos.write(buffer,0,length);
				length = is.read(buffer);
			 }
			} catch (IOException e) {e.printStackTrace();}finally{
			if(is!=null){
				try {
					is.close();
				} catch (IOException e) {e.printStackTrace();}
			}
			if(fos!=null){
				try {
					fos.close();
				} catch (IOException e) {e.printStackTrace();}
			}
		  }		
	}
	
	/**
	 *方法描述：
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午02:03:39
	 *@功能:复制一个文件夹,包含文件夹下的文件
	 */
	public void copyADir(File sourceFile,File targetFile){
		InputStream is = null;
		FileOutputStream fos = null;
		if(!targetFile.exists()){
			targetFile.mkdir();
		}
		if(targetFile.isDirectory() && sourceFile.isDirectory()){
			File[] files = sourceFile.listFiles();
			for(File file:files){
				if(file.isFile()){
					try {
						File tFile = new File(targetFile.getAbsolutePath()+"//"+file.getName());
						tFile.createNewFile();
						is = new FileInputStream(file);
						fos = new FileOutputStream(tFile);
						byte[] buffer = new byte[1024];
						int length = is.read(buffer);
						while(length != -1){
							fos.write(buffer,0,length);
							length = is.read(buffer);
						 }
						} catch (IOException e) {e.printStackTrace();}finally{
						if(is!=null){
							try {
								is.close();
							} catch (IOException e) {e.printStackTrace();}
						}
						if(fos!=null){
							try {
								fos.close();
							} catch (IOException e) {e.printStackTrace();}
						}
					  }
				}
			}
		}		
	}

	/**
	 *方法描述：getFileNames
	 *@作者: hjl
	 *@日期：2012-9-5 时间：下午02:06:56
	 *@功能:获得文件名
	 */	
    public String[] getFileNames(File file){
		FileNameFilter filter = new FileNameFilter(".java");
		String[] fileNames = file.list(filter);//对文件类型进行过滤
		return fileNames;
    }

	/**
	 * 方法描述:getFilePath
	 * @作者:hjl
	 * @日期:2012-9-6 时间:下午07:36:37
	 * @功能:得到文件路径
	 */	
	public String getFilePath(File file){
		return file.getAbsolutePath();
	}
	/**
	 * 方法描述:getFileContent
	 * @作者:hjl
	 * @日期:2012-9-7 时间:上午11:33:50
	 * @功能: 获得文件内容,并且解决中文乱码问题
	 * @param file
	 * @return
	 */
	public String getFileContent(File file){
		StringBuffer strBuffer = new StringBuffer("");
		try {
			FileInputStream in = new FileInputStream(file);
			InputStreamReader inReader = new InputStreamReader (in,"utf-8");
			BufferedReader bufReader=new BufferedReader(inReader);
			String tempStr;
			try {
				tempStr = bufReader.readLine();
				while(tempStr!=null){
					strBuffer.append(tempStr+"/n");
					tempStr = bufReader.readLine();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return strBuffer.toString();
	}
	/**
	 * 方法描述:getInputStreamFromFile
	 * @作者:hjl
	 * @日期:2012-10-10 时间:下午09:43:30
	 * @功能:获得文件的输入流 
	 * @param file
	 * @return
	 */
	public InputStream getInputStreamFromFile(File file){
		InputStream in = null;
		try {
			in = new FileInputStream(file);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return in;
	}
	
}
/**
 *类描述：
 *@作者: hjl
 *@日期：2012-9-5 时间：下午02:05:40
 *@function:用于过滤文件名
 */
class FileNameFilter implements FilenameFilter{
	public String type;
    public FileNameFilter(String tp){this.type=tp;}
	public boolean accept(File dir, String path) {
		String filename=new File(path).getName();
		return filename.indexOf(type)!=-1;
	}
}
